home *** CD-ROM | disk | FTP | other *** search
/ Delphi 2 - Developers' Solutions / Delphi 2 Developers' Solutions.iso / dds / sharware / debmono / srpdebug.c < prev   
Encoding:
C/C++ Source or Header  |  1995-09-28  |  4.0 KB  |  199 lines

  1. // SRPDEBUG for VBXs
  2.  
  3.  
  4. /***************************************************************************/
  5. /***************************************************************************/
  6. /*******                 DEBUG/TRACE FACILITY                       ********/
  7. /***************************************************************************/
  8. /***************************************************************************/
  9.  
  10. #define DB(a) a
  11. #define D()
  12. #include <dos.h>
  13. #include <stdarg.h>
  14.  
  15. #define UWRD unsigned int 
  16. #define UCHR unsigned char 
  17. #define BASEFUNC
  18.  
  19. static UWRD VSEG = 0xFFFF;
  20. static UWRD MonoOn = 1;                        // Sw from env vbl to activate
  21. extern UWRD GETSEL(void);
  22.  
  23. /*-------------------------------------
  24.  * Display on MonoMonitor
  25.  *
  26.  * To enable the TSR to 'share' the same 
  27.  * screen we always look for the previous
  28.  * prompt, apart from the first time
  29.  * when we assume we are dealing with
  30.  * a new screen.
  31.  */
  32. void D()DebDsp(char *str) 
  33. {
  34. static int ftsw = 0;
  35. int col, ii;
  36. UWRD far *up;
  37. UCHR far *vp;
  38.  
  39. if(VSEG == 0xFFFF){
  40.     if (MonoOn == 0)                            // Harmless state if no DBMON=* or P
  41.         return;
  42.     VSEG = GETSEL();
  43.     if (VSEG == 0xFFFF)
  44.         return;
  45. }
  46.  
  47. if (ftsw == 0) {
  48.     ftsw = 1;
  49.     for(vp = MK_FP(VSEG,0); *vp != '' && FP_OFF(vp) < 25*80*2;vp+=2*80){
  50.     }
  51.     if (FP_OFF(vp) >= 25*80*2){
  52.         up = MK_FP(VSEG,0);
  53.         for(ii=0; ii<=25*80; ii++)
  54.             *up++ = 0x07FA;
  55.     }
  56. }
  57.  
  58. for(vp = MK_FP(VSEG,0); *vp != '' && FP_OFF(vp) < 25*80*2;vp+=2*80){
  59. }
  60. if (FP_OFF(vp) >= 25*80*2){
  61.     vp = MK_FP(VSEG,0);
  62. }
  63. up = (UWRD far *)vp;
  64.  
  65. col = 0;
  66. for(col=0; col<70; col++){                    /* ----- display our trap message---*/
  67.     if(*str)
  68.         *up++ = 0x7000 + *str++;
  69.     else
  70.         *up++ = 0x7000 + ' ';
  71.     if(col >69)
  72.         break;
  73. }
  74. if (FP_OFF(vp) == 24*80*2)
  75.     vp = MK_FP(VSEG,0);
  76. else
  77.     vp += 2*80;
  78. up = (UWRD far *)vp;
  79. for(col=0; col<70; col++){                    // Add ptr line to show current
  80.     *up++ = 0x0700 + ((col<10)?'':' ');
  81. }
  82. }
  83.  
  84.  
  85.  
  86. /*-------------- For debug show given status on alt screen ----------------*/
  87. void D()debstat(int row,char *bf)
  88. {
  89. #define COLs  70
  90. UCHR *vp = MK_FP(VSEG,row*160 + 2*COLs);
  91. int ii = 80 - COLs;
  92.  
  93. if(VSEG == 0xFFFF){
  94.     if (MonoOn == 0)                            // Harmless state if no DBMON=* or P
  95.         return;
  96.     VSEG = GETSEL();
  97.     if (VSEG == 0xFFFF)
  98.         return;
  99. }
  100.  
  101. while(ii-- > 0) {
  102.     if (*bf)
  103.         *vp++ = *bf++;
  104.     else
  105.         *vp++ = ' ';
  106.     *vp++ = 0x07;
  107. }
  108. }
  109.  
  110. /*-------------------------------------
  111.  * Debugging aid.
  112.  */
  113. void BASEFUNC D()Z(char *str,...)
  114. {
  115. char bf[200];
  116. va_list argptr;
  117. UWRD n;
  118. va_start(argptr,str);
  119. vsprintf(bf,str,argptr);
  120. if (*bf == '!') {
  121.     n = (*(bf+1) & 0x0f)*10 + (*(bf+2) & 0x0f);
  122.     if (n > 24) n = 24;
  123.     debstat(n,bf+3);
  124.     return;
  125. }
  126. DebDsp(bf);
  127. }
  128.  
  129. /*-------------------------------------
  130.  *htoa: hex -> asci (char -> char(2))
  131.  */
  132. char *htoa(UCHR val)
  133. {
  134. char static ans[2];
  135. int i;
  136. char static vals[17] = "0123456789ABCDEF";
  137. i = val & 0x00f0;
  138. i = i >> 4;
  139. ans[0] = vals[i];
  140. i = val & 0x000f;
  141. ans[1] = vals[i];
  142. return(&ans[0]);
  143. }
  144.  
  145. /*-------------------------------------
  146.  * Memory dump.
  147.  */
  148. void D()MemDump(FILE *f,char *buf,UWRD len)
  149. {
  150.  char *bufp;
  151.  int ii,jj;
  152.  char x1;
  153.  char c1;
  154.  char aadr[99];
  155.  char *p1,*p2,*htoa(),*pstop;
  156.  char static blnk[2] = {' ',' '};
  157.  
  158. pstop = &buf[len+1];
  159.  
  160. for(ii = 0; ii<79; ii++) {
  161.    aadr[ii] = ' ';
  162. }
  163.  
  164. for(ii = 0;ii<len;ii = ii+16) {
  165.    x1 = ii;p1 = htoa(x1); 
  166.    aadr[2] = *p1; aadr[3] = *(p1+1);
  167.    x1 = ii>>8;p1 = htoa(x1); 
  168.    aadr[0] = *p1; aadr[1] = *(p1+1);
  169.    bufp = &buf[ii];
  170.    p2 = &aadr[5];
  171.    for(jj = 0;jj<16;jj++) {
  172.       if ((jj % 4) == 0)
  173.           p2++;
  174.       if (FP_OFF(bufp) < FP_OFF(pstop))
  175.           p1 = htoa(*bufp);
  176.       else
  177.           p1 = blnk;
  178.       *p2 = *p1; p2++; *p2 = *(p1+1); p2++;
  179.       bufp++;
  180.    } 
  181.    bufp = &buf[ii];
  182.    p2 = p2 + 3;
  183.    for(jj = 0;jj<16;jj++) {
  184.        if (FP_OFF(bufp) >= FP_OFF(pstop)){
  185.           c1 = ' ';
  186.          }else{
  187.           c1 = *bufp & 0x7f;
  188.           if ((c1 < ' ') || (c1 > 0x7e)) 
  189.              c1 = '.';
  190.          }
  191.        *p2 = c1; p2++;
  192.        bufp++;
  193.    } 
  194.    aadr[60] = 0x00;
  195.     fprintf(f,"%s\n",aadr);
  196. }
  197.  
  198.